package com.macro.mall.tiny.service.Impl;


import com.github.pagehelper.PageHelper;
import com.macro.mall.tiny.dao.PmsProductCategoryAttributeRelationDao;
import com.macro.mall.tiny.dao.PmsProductCategoryDao;
import com.macro.mall.tiny.dto.ProductCategoryParam;
import com.macro.mall.tiny.mbg.mapper.PmsProductCategoryAttributeRelationMapper;
import com.macro.mall.tiny.mbg.mapper.PmsProductCategoryMapper;
import com.macro.mall.tiny.mbg.mapper.PmsProductMapper;
import com.macro.mall.tiny.mbg.model.*;
import com.macro.mall.tiny.service.PmsProductCategoryService;
import com.macro.mall.tiny.vo.PmsProductCategoryWithChildrenItem;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class PmsProductCategoryServiceImpl implements PmsProductCategoryService {

    @Autowired
    private PmsProductCategoryMapper pmsProductCategoryMapper;
    @Autowired
    private PmsProductCategoryAttributeRelationDao pmsProductCategoryAttributeRelationDao;
    @Autowired
    private PmsProductMapper pmsProductMapper;
    @Autowired
    private PmsProductCategoryAttributeRelationMapper pmsProductCategoryAttributeRelationMapper;
    @Autowired
    private PmsProductCategoryDao pmsProductCategoryDao;

    //添加商品分类
    @Override
    public Integer create(ProductCategoryParam productCategoryParam) {
        PmsProductCategory pmsProductCategory=new PmsProductCategory();
        pmsProductCategory.setProductCount(0);
        BeanUtils.copyProperties(productCategoryParam,pmsProductCategory);
        //没有父类时为一级分类
        setCategoryLevel(pmsProductCategory);
        Integer code=pmsProductCategoryMapper.insertSelective(pmsProductCategory);

        //创建筛选属性关联
        List<Long> productAttributeIdList=productCategoryParam.getProductAttributeIdList();
        if(!CollectionUtils.isEmpty(productAttributeIdList)){
            insertRelationList(pmsProductCategory.getId(),productAttributeIdList);
        }

        return code;
    }

    //修改商品分类
    @Override
    public Integer update(Long id, ProductCategoryParam productCategoryParam) {
        PmsProductCategory pmsProductCategory=new PmsProductCategory();
        pmsProductCategory.setId(id);
        BeanUtils.copyProperties(productCategoryParam,pmsProductCategory);
        setCategoryLevel(pmsProductCategory);

        //更新商品分类时要更新商品中的名称
        PmsProduct pmsProduct=new PmsProduct();
        pmsProduct.setProductCategoryName(pmsProductCategory.getName());
        PmsProductExample example=new PmsProductExample();
        PmsProductExample.Criteria criteria= example.createCriteria();
        criteria.andProductCategoryIdEqualTo(id);
        pmsProductMapper.updateByExampleSelective(pmsProduct,example);

        //同时更新筛选属性的信息
        if(!CollectionUtils.isEmpty(productCategoryParam.getProductAttributeIdList())){
            PmsProductCategoryAttributeRelationExample example1=new PmsProductCategoryAttributeRelationExample();
            PmsProductCategoryAttributeRelationExample.Criteria criteria1=example1.createCriteria();
            criteria1.andProductCategoryIdEqualTo(id);
            pmsProductCategoryAttributeRelationMapper.deleteByExample(example1);
            insertRelationList(id,productCategoryParam.getProductAttributeIdList());
        }else{
            PmsProductCategoryAttributeRelationExample example1=new PmsProductCategoryAttributeRelationExample();
            PmsProductCategoryAttributeRelationExample.Criteria criteria1=example1.createCriteria();
            criteria1.andProductCategoryIdEqualTo(id);
            pmsProductCategoryAttributeRelationMapper.deleteByExample(example1);
        }

        Integer code=pmsProductCategoryMapper.updateByPrimaryKeySelective(pmsProductCategory);

        return code;
    }


    //分页查询商品分类
    @Override
    public List<PmsProductCategory> getList(Long parentId, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        PmsProductCategoryExample example=new PmsProductCategoryExample();
        PmsProductCategoryExample.Criteria criteria= example.createCriteria();
        example.setOrderByClause("sort desc");
        if(parentId!=null){
            criteria.andParentIdEqualTo(parentId);
        }
        List<PmsProductCategory> pmsProductCategoryList=pmsProductCategoryMapper.selectByExample(example);

        return pmsProductCategoryList;
    }

    //根据id获取商品分类
    @Override
    public PmsProductCategory getById(Long id) {
        PmsProductCategory pmsProductCategory=pmsProductCategoryMapper.selectByPrimaryKey(id);
        return pmsProductCategory;
    }

    //删除商品分类
    @Override
    public Integer deleteById(Long id) {
        Integer code=pmsProductCategoryMapper.deleteByPrimaryKey(id);

        PmsProductCategoryAttributeRelationExample example=new PmsProductCategoryAttributeRelationExample();
        PmsProductCategoryAttributeRelationExample.Criteria criteria= example.createCriteria();
        criteria.andProductCategoryIdEqualTo(id);
        pmsProductCategoryAttributeRelationMapper.deleteByExample(example);

        return code;
    }

    //修改导航栏显示状态
    @Override
    public Integer updateNavStatus(List<Long> ids, Integer navStatus) {
        PmsProductCategory pmsProductCategory=new PmsProductCategory();
        pmsProductCategory.setNavStatus(navStatus);
        PmsProductCategoryExample example=new PmsProductCategoryExample();
        PmsProductCategoryExample.Criteria criteria= example.createCriteria();
        criteria.andIdIn(ids);
        Integer code=pmsProductCategoryMapper.updateByExampleSelective(pmsProductCategory,example);

        return code;
    }

    //修改显示状态
    @Override
    public Integer updateShowStatus(List<Long> ids, Integer showStatus) {
        PmsProductCategory pmsProductCategory=new PmsProductCategory();
        pmsProductCategory.setShowStatus(showStatus);
        PmsProductCategoryExample example=new PmsProductCategoryExample();
        PmsProductCategoryExample.Criteria criteria= example.createCriteria();
        criteria.andIdIn(ids);
        Integer code=pmsProductCategoryMapper.updateByExampleSelective(pmsProductCategory,example);

        return code;
    }

    //查询所有一级分类及其子类
    @Override
    public List<PmsProductCategoryWithChildrenItem> listWithChildren() {
        return pmsProductCategoryDao.listWithChildren();
    }

    private void insertRelationList(Long id, List<Long> productAttributeIdList) {
        List<PmsProductCategoryAttributeRelation> relationList=new ArrayList<>();
        for(Long productAttrId:productAttributeIdList){
            PmsProductCategoryAttributeRelation pmsProductCategoryAttributeRelation=new PmsProductCategoryAttributeRelation();
            pmsProductCategoryAttributeRelation.setProductCategoryId(id);
            pmsProductCategoryAttributeRelation.setProductAttributeId(productAttrId);
            relationList.add(pmsProductCategoryAttributeRelation);
        }
        pmsProductCategoryAttributeRelationDao.insertList(relationList);
    }

    private void setCategoryLevel(PmsProductCategory pmsProductCategory){
        //没有父类时为一级分类
        if(pmsProductCategory.getParentId()==0){
            pmsProductCategory.setLevel(0);
        }else{
            //有父类时根据父类level设置
            PmsProductCategory parentCategory=pmsProductCategoryMapper.selectByPrimaryKey(pmsProductCategory.getParentId());
            if(parentCategory!=null){
                pmsProductCategory.setLevel(parentCategory.getLevel()+1);
            }else{
                pmsProductCategory.setLevel(0);
            }
        }

    }
}
